#!/usr/bin/python
# -*- coding: utf-8 -*-

##
# Módulos del sistema
try:
    import sys
except IndexError, error:
    print error
    print "Problemas al cargar los módulos de sistema."

##
# Módulos definidos por nosotros
try:
    import config
except ImportError, error:
    print error
    print "Problemas al cargar los módulos del programa"

class DocumentoLatex:
    def __init__(self, libro):
        self.libro = libro
        self.estilos = {}
        for k, v in self.libro["estilos"].iteritems():
            self.estilos[k] = eval(v)
        self.salida_actual = open(self.libro["salidatex"], "w")
        self.generar_encabezado()
        self.encoding = ""
        self.numero_capitulo = 0

    def generar_encabezado(self):
        temp = open("encabezado.tex", "r").read()
        self.encabezado = temp.replace("#titulo", self.libro["titulo"])
        self.encabezado = self.encabezado.replace("#autor", self.libro["autor"])
        self.encabezado = self.encabezado.replace("#fecha", self.libro["fecha"])
        self.salida_actual.write(self.encabezado)
        self.texto_salida = ""

    def escribir_archivo(self):
        #self.texto_salida = self.texto_salida.encode("utf-8")
        #self.texto_salida = self.texto_salida.decode('utf-8')
        self.texto_salida = self.texto_salida.encode(self.encoding)
        #print self.texto_salida
        self.salida_actual.write(self.texto_salida)

    def pie_de_pagina(self, texto):
        self.texto_salida = "\\footnote{%s} " % texto
        self.escribir_archivo()

    def titulo(self, texto):
        self.texto_salida = "\n\n\\textbf{%s}\n\n" % texto
        self.escribir_archivo()

    def verbatim(self, texto):
        self.texto_salida = "\\begin{verbatim}\n%s\n\\end{verbatim}" % texto
        self.escribir_archivo()

    def controlador_h1(self, texto):
        if "Chapter" in texto:
            texto = texto.split(". ")[1]
            self.capitulo(texto)
        else:
            self.seccion(texto)

    def abrir_vineta(self):
        self.texto_salida = "\\begin{itemize}\n"
        self.escribir_archivo()

    def cerrar_vineta(self):
        self.texto_salida = "\\end{itemize}\n"
        self.escribir_archivo()

    def vineta(self, texto):
        self.texto_salida = "\\item %s\n" % texto
        self.escribir_archivo()

    def escribir(self, texto, estilo):
        func = self.estilos[estilo]
        if estilo not in ["pre"]:
            texto = self.procesar_texto(texto)
        func(texto)

    def prefacio(self, texto):
        self.texto_salida = "\\chapter*{%s}\n" % texto
        self.escribir_archivo()

    def capitulo(self, texto):
        self.numero_capitulo += 1
        try:
            self.texto_salida = "\\chapter{%s}\n" % texto.split(". ")[1]
        except IndexError:
            self.texto_salida = "\\chapter{%s}\n" % texto
        self.escribir_archivo()

    def texto(self, texto):
        self.texto_salida = "\n%s\n" % texto
        self.escribir_archivo()

    def finalizar(self):
        self.texto_salida = "\\end{document}"
        self.escribir_archivo()
        self.salida_actual.close()
        print "Exito!"
        sys.exit(0)

    def seccion(self, texto):
        try:
            self.texto_salida = "\\section{%s}" % texto.split(". ")[1]
        except IndexError:
            if self.numero_capitulo != 0:
                self.texto_salida = "\\section{%s}" % texto
            else:
                self.texto_salida = "\\section*{%s}" % texto
        self.escribir_archivo()

    def enlace(self, texto):
        self.texto_salida = "\\textbf{%s} " % texto
        self.escribir_archivo()

    def procesar_texto(self, texto):
        # establecimos prioridades en los diccionarios para reemplazar
        # los caracteres
        for k, v in config.primero.iteritems():
            texto = texto.replace(k, v)
        for k, v in config.segundo.iteritems():
            texto = texto.replace(k, v)
        for k, v in config.tercero.iteritems():
            texto = texto.replace(k, v)
        return texto

    def subseccion(self, texto):
        self.texto_salida = "\\subsection{%s}" % texto
        self.escribir_archivo()

    def subsubseccion(self, texto):
        self.texto_salida = "\\subsubsection{%s}" % texto
        self.escribir_archivo()

    def parte(self, texto):
        try:
            self.texto_salida = "\\part{%s}" % texto.split(": ")[1]
        except IndexError:
            self.texto_salida = "\\part{%s}" % texto
        self.escribir_archivo()
